package xyz.zhouxf.rpc.serializer;

import xyz.zhouxf.rpc.enumeration.SerializerCode;
import xyz.zhouxf.rpc.serializer.impl.HessianSerializer;
import xyz.zhouxf.rpc.serializer.impl.JsonSerializer;
import xyz.zhouxf.rpc.serializer.impl.KryoSerializer;
import xyz.zhouxf.rpc.serializer.impl.ProtobufSerializer;

/**
 * @author zhouxf
 * @date 2022/8/20
 */
public interface RpcSerializer {

    Byte DEFAULT_SERIALIZER = SerializerCode.PROTOBUF.getCode();

    /**
     * 提供序列化器码获取一个序列化器
     * @param code 序列化器码
     * @return 序列化器
     */
    static RpcSerializer getRpcSerializer(byte code) {
        switch (code) {
            case 0:
                return new KryoSerializer();
            case 1:
                return new JsonSerializer();
            case 2:
                return new HessianSerializer();
            case 3:
                return new ProtobufSerializer();
            default:
                return null;
        }
    }

    /**
     * 序列化
     * @param object 序列化对象
     * @return 序列化数据
     */
    <T> byte[] serialize(T object);

    /**
     * 反序列化
     * @param data 反序列化数据
     * @param type 反序列化对象类型
     * @return 反序列化对象
     */
    <T> T deserialize(byte[] data, Class<T> type);

    /**
     * 获取序列化器码
     * @return 序列化器码
     */
    byte getCode();

}
